package c3p0Test;

import java.sql.SQLException;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3p0Test {

	// 七大参数：
    //corePoolSize : 核心线程数[一直存在除非设置了allowCoreThreadTimeOut]；线程池创建好(new Thread())以后就准备就绪的线程数量，就等待来接收异步任务去执行。
    //maximumPoolSize ：最大线程数；控制资源（即使100万个异步任务也按最大线程数量运行）
    //keepAliveTime ：存活时间；如果当前正在运行的线程数量大于核心数量；释放空闲线程（最大线程数-核心线程数） 只要线程空闲大于指定keepAliveTime。
    //unit : keepAliveTime的时间单位
    //BlockingQueue workQueue ：阻塞队列；如果任务有很多，就会将目前多的任务放在队列里面，只要有线程空闲，就会去队列里面取出新的任务继续执行。
    //threadFactory ：线程的创建工厂。
    //RejectedExecutionHandler handler ：如果队列(workQueue)满了，按照指定的拒绝策略，拒绝执行任务。
    //工作顺序：
    //线程池创建，准备好corePoolSize数量的核心线程，准备接受任务。
    //新的任务进来，用core准备好的空闲线程执行。
    //2.1. 核心线程满了，就将再进来的任务放入阻塞队列中，空闲的核心线程就会自己去阻塞队列获取任务执行。
    //2.2. 阻塞队列满了，就直接开新线程执行，最大只能开到maximumPoolSize指定的值。
    //2.3. max都执行好了，新建（最大线程数-核心线程数）的空闲线程会在keepAliveTime指定的时间后自动销毁，最终保持到核心线程数(core)的大小。
    //2.4. 如果线程数开到了max的数量，还有新任务进来，就会使用handler指定的拒绝策略进行处理。
    //所有的线程都是由指定的threadFactory创建的。
    int i = 0;
	public static void main(String[] args) throws SQLException, InterruptedException {
        BlockingQueue queue = new LinkedBlockingQueue(10);
        ThreadPoolExecutor executor= new ThreadPoolExecutor(2,100,10L, TimeUnit.SECONDS,queue);
        while (true){
            for (int i = 0; i <80 ; i++) {
                try {
                    executor.submit(() -> {
                        System.out.println("ThreadName"+Thread.currentThread().getName());
                        try {
                            Thread.sleep(5000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    });
                }catch (Exception e){
                    e.printStackTrace();
                    System.out.println("========"+i++);
                }
            }
           Thread.sleep(5000000);
        }

	}
}
